MIPS assembly - Loops and Conditionals (jumps and branches)
Jump instruction - j - "unconditional"
j LABEL # jump to LABEL
Example 1: Infinite loop
L1: add $s0, $s1, $s2
    add $s3, $s4, $s5
    j L1
- After a jump instruction, the next one to execute is the labeled one.
 - The jump instruction places the address of the labeled instruction into the program counter.
 - Labels exist in Assembly code only - when assembled, labels are replaced with the address of the labeled instruction.
 
Conditionals/branching - BEQ and BNE
BEQ $t0, $t1, LABEL # "branch on equal" - if t0 = t1, then go to LABEL
BNE $t0, $t1, LABEL # "branch on not equal" - if t0 != t1, then go to LABEL
Only jump to label if condition is satisfied.
Example 2: Convert the following C++ code to MIPS
for (int i = 0; i != 10; i++)
    // a is an int with value in $s0
    // keep a in $s0
    a++;
Answer:
We know we can translate a++ like this:
addi $s0, $s0, 1 # a++
Now we need to do the rest of the for-loop:
        addi $t7, $zero, 0 # t7 has the value of i
        addi $t6, $zero, 10 # put 10 in t6
START:  beq $t7, $t6, EXIT # check loop condition
        addi $s0, $s0, 1 # a++ - loop body
        addi $t7, $t7, 1 # i++
        j START # back to loop start
EXIT:   ... # no need to fill in anything after EXIT label
Conditionals - SLT, SLTI, SLTU, and SLTIU instructions
SLT stands for "set on less than":
- "setting" a register means setting it to 1
 - "clearing" a register means setting it to 0
 
slt     $t0, $t1, $t2   # is t1 < t2 true?
slti    $t0, $t1, 234   # is t1 < 234 true?
sltu    $t0, $t1, $t2   # unsigned ver. of slt
sltiu   $t0, $t1, 234   # unsigned ver. of slti
For sltu and sltiu, the comparisons are unsigned - treat values of $t1 and $t2 as unsigned integers when doing comparison.
Note: there is no "greater-than" instruction, everything can be done with beq/bne and slt and friends.
Example 3: Convert the following C++ code to MIPS
if (var < 10)
    var++; // value of var is in $s6
Answer:
We know we can translate var++ like this:
addi $s6, $s6, 1 # var++
Conditional:
slti $t7, $s6, 10 # var < 10? if so put 1 in t7
beq $t7, $zero, EXIT # if var not < 10, skip
addi $s6, $s6, 1 # var++
EXIT:
Example 3: Convert the following C++ code to MIPS
// value of a is in s6
// value of var is in s2
if (10 < a)
    var++;
Answer:
addi $s0, $zero, 10 # put 10 in s0
slt $s1, $s0, $s6 # 10 < a?
beq $s1, $zero, EXIT # exit if 10 not < a
addi $s2, $s2, 1 # var++
EXIT: